/******** hay que filtrar los comentarios de C ********/

int x, y;    // tambien los comentarios de C++

             // se permiten variables globales estáticas

int c;       // declarado para la prueba con los caracteres
int fact(int n) {   // un único parámetro (o ninguno) y sólo tipos enteros

  int temp;         // es posible variables locales dinámicas
  temp = n;
  if (temp)
    return n * fact(n-1);
  else
    return 1;
}

// Extended ascii muestra el codigo ascii extendido de un char (signed byte)
int extendedAscii(char n)
{
        if(n + abs(n))
	   return n;
	else
	   return -n+127;

}

int main(void) {   // parámetro void o sin parámetro


    int a,b,z;
    int letraF;
    int extendedAsciideJuan;
    char m;


    m=3;	
    x = 6;


    printf("\n*******************************************************\n");
    printf("Programa de prueba de compilador de PLI\n");
    printf("Autores: Alfonso Sendra Gemero y Rafael Sanchez Martinez\n");
    printf("*******************************************************\n\n\n");
    
    printf("Llamada  a función factorial: \n");
    printf("printf(\"factorial(%%d) = %%d\\n\", m, fact(m)); \n\n");

    printf("factorial(%d) = %d\n", m, fact(m));

    printf("\n\n");

  
    printf("En las llamadas a funciones exteriores se permiten varios argumentos\n");
    printf("y caracteres alfanumericos, \n");
    printf("como se puede comprobar por las llamadas a printf que hace este programa \n\n");	
    
    printf("Se permiten secuencias de asignaciones \n\n"); 
    printf("a=4,b=8; \n\n");
 
    a=4,b=8; // Se permiten secuencias de asignaciones

    printf("Se implementa el modulo y los pre-incrementos y post-incrementos\n\n"); 
    printf("z = b %% a++; \n\n"); 

    z = b % a++; // Se implementa el módulo, y los pre-incrementos y post-incrementos

    printf("Vemos el resultado: \n\n"); 
   
    printf("Resto de entre b (8) y a(4) es: %d\n\n",z);

    printf("La variable 'a' fue post incrementada a %d\n\n",a);


    printf("Implementadas la conversion de tipos y el chequeo entre int y char\n\n");   

    printf("letraF = 'f';\nprintf(\"Signed Ascii de f es %%d\\n\",letraf);\n\n");   

    letraF = 'f';
    printf("Signed Ascii de f es %d\n",letraF);
     
    

    printf("Incremento y decremento con caracteres\n\n");
    printf("m= ('A' + 1);\nm = --m;\nm = ++m;\nc = m++;\n\n");

    m= ('A' + 1);
    m = --m;
    m = ++m;
    c = m++;

    printf("m ha de quedar como 'C': %c\n",m);
    printf("c ha de quedar como 66: %d\n",c);

    printf("Extended ascii muestra el codigo ascii extendido de un char (signed byte)\n\n");
    printf("Extended Ascii de '2'+200 : %d\n\n",extendedAscii('2'+200));

    return 0;
}
